package org.pentaho.platform.repository2.unified.jcr.sejcr; import org.apache.jackrabbit.api.XASession; import org.junit.Test; import org.springframework.extensions.jcr.SessionFactory; import org.springframework.extensions.jcr.jackrabbit.LocalTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import javax.transaction.xa.XAResource; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Created by nbaker on 10/17/16. */ public class PentahoTransactionManagerTest { @Test public void getTransactionDefinition() throws Exception { PentahoTransactionManager transactionManager = new PentahoTransactionManager(); SessionFactory sessionFactory = mock( SessionFactory.class ); XASession xaSession = mock( XASession.class ); when( xaSession.getXAResource() ).thenReturn( mock( XAResource.class ) ); transactionManager.setSessionFactory( sessionFactory ); TransactionDefinition transactionDefinition = mock( TransactionDefinition.class ); when( transactionDefinition.getIsolationLevel() ).thenReturn( -1 ); // Main assertion. While doBegin is being called, the transactionDefinition can be reached. AtomicBoolean wasAvailable = new AtomicBoolean( false ); when( sessionFactory.getSession() ).then( invocation -> { assertEquals( transactionDefinition, transactionManager.getTransactionDefinition() ); wasAvailable.set( true ); return xaSession; } ); transactionManager.getTransaction( transactionDefinition ); assertTrue( wasAvailable.get() ); // after life of doBegin call the definition is not available assertNull( transactionManager.getTransactionDefinition() ); } @Test public void isCreatingTransaction() throws Exception { PentahoTransactionManager transactionManager = new PentahoTransactionManager(); SessionFactory sessionFactory = mock( SessionFactory.class ); XASession xaSession = mock( XASession.class ); when( xaSession.getXAResource() ).thenReturn( mock( XAResource.class ) ); transactionManager.setSessionFactory( sessionFactory ); TransactionDefinition transactionDefinition = mock( TransactionDefinition.class ); when( transactionDefinition.getIsolationLevel() ).thenReturn( -1 ); // All of our assertions must be done while doBegin is being called when( sessionFactory.getSession() ).then( invocation -> { List<Integer> transDefs = Arrays .asList( TransactionDefinition.PROPAGATION_NESTED, TransactionDefinition.PROPAGATION_REQUIRED, TransactionDefinition.PROPAGATION_REQUIRES_NEW ); for ( Integer transDef : transDefs ) { when( transactionDefinition.getPropagationBehavior() ).thenReturn( transDef ); assertTrue( transactionManager.isCreatingTransaction() ); } return xaSession; } ); // Calls doBegin transactionManager.getTransaction( transactionDefinition ); } }